package com.atguigu.queue;

import com.sun.jmx.remote.internal.ArrayQueue;

import java.util.Scanner;

public class QueueDemo {
    public static void main(String[] args) {

        //测试环形队列

        QueueArray que = new QueueArray(4);//预留一个空间，有效数据个数为3
        Scanner scanner = new Scanner(System.in);
        char cr= ' ';
        boolean flag = true;
        while (flag){
            System.out.println("插入数据请输入i");
            System.out.println("取入数据请输入r");
            System.out.println("退出请输入q");
            System.out.println("查询队列数据请输入s");
            System.out.println("查询队列头部数据请输入h");
            System.out.println("查询队列有效数据个数请输入c");
            cr = scanner.next().charAt(0);
            switch (cr){
                case 'i':
                    int i = scanner.nextInt();
                    que.addQueue(i);
                    break;

                case 'r':
                    que.remvQueue();
                    break;
                case 'q':
                    flag = false;
                    break;

                case 's':
                    que.showQueue();
                    break;

                case 'h':
                    que.headQueue();
                    break;

                case 'c':
                    que.cunQueue();
                    break;
            }
        }



    }
}
class QueueArray{

    int start=0;
    int end=0;
    int max;
    int arr[];

    public QueueArray(int maxSize){
        arr = new int[maxSize];
        max = maxSize;
    }

    //判断队列是否为空
    public boolean isEmpty(){
        if (start==end){
            return true;
        }else {
            return false;
        }
    }

    //判断队列是否已满
    public boolean isFull(){
        if((end+1)%max==start){
            return true;
        }else {
            return false;
        }
    }

    //往队列里面插入数据
    public void addQueue(int val){

        if (isFull()){
            System.out.println("队列已满");
            return;
        }
            //环形队列，假如队列有三个数据，通过取模的方式，可以让数组队尾一直循环0,1,2
            arr[end] = val;
            end = (end+1)%max;
    }

    public void remvQueue(){
        if (isEmpty()){
            System.out.println("队列为空,无法取出数据");
            return;
        }else {
            System.out.printf("取出一个数据,%d\n",arr[start]);
            start = (start+1)%max;;
        }

    }

    //查看队列有哪些数据
    public void showQueue(){

        if (isEmpty()){
            System.out.println("队列为空，无法输出数据");
            return;
        }

        for (int i=start;i<start+cunQueue();i++){
            System.out.printf("arr[%d]: %d\n",i%max,arr[i%max]);
        }
    }

    //取出当前队列头部的数据
    public void headQueue(){
        System.out.println("头部数据为:"+arr[start]);
    }

    //计算队列大小
    public int cunQueue(){
        int cun = (end+max-start)%max;
        System.out.println("队列有效个数为:"+cun);
        return cun;
    }

}